#include "error_code_loader.h"
#include <fstream>
#include <sstream>
#include <regex>
#include <iostream>
#include "log/syslog.h"

#define TAG "ErrorCodeLoader"
using namespace std;
using namespace equip_system;
extern system_log::CSysLog syslog;

bool ErrorCodeLoader::load(const std::string &file_path)
{
    std::ifstream file(file_path);
    if (!file.is_open())
    {
        ES_LOG(TAG, LEVEL_ERROR, "Failed to open error codes file: %s", file_path.c_str());
        return false;
    }

    std::string line;
    bool in_error_section = false;

    /**
     * C++ 正则引擎 Bug 或 编译器/标准库实现问题。
     * 在 Windows + MSVC 上，对 std::regex 的字符类 [^]] 有已知缺陷：
     * - 当右方括号 ] 紧跟在取反符号 ^ 后时，MSVC 的解析器会把它当成未闭合的字符类而匹配失败。
     * 
     * - 错误正则表达式
     * const std::regex section_regex("^\\s*\\[([^]]+)\\]\\s*$", std::regex::icase);
     * const std::regex section_regex(R"(^\[([^]]+)\])", std::regex::icase);
     * 
     * -正确正则表达式
     * const std::regex section_regex(R"(^\[([^\[\]]+)\])", std::regex::icase);
     * const std::regex section_regex(R"(^\[(.+?)\])", std::regex::icase);
     */
    const std::regex section_regex(R"(^\[([^\[\]]+)\])", std::regex::icase);
    // const std::regex section_regex(R"(^\[(.+?)\])", std::regex::icase);
    const std::regex key_value_regex("^\\s*(\\d+)\\s*=\\s*(.*?)\\s*$");

    while (std::getline(file, line))
    {
        // 清理首尾空白（包括制表符等）
        line.erase(0, line.find_first_not_of(" \t\r\n"));
        line.erase(line.find_last_not_of(" \t\r\n") + 1);

        // 忽略空行和注释
        if (line.empty() || line[0] == ';' || line[0] == '#')
        {
            continue;
        }

        // 3. 调试输出
        std::cout << "line.size()=" << line.size() << " |";
        for (unsigned char c : line)
            std::printf("%02x ", c);
        std::cout << "|\n";

        // 检查是否是section
        std::smatch match;
        bool res = std::regex_match(line, match, section_regex);
        if (res == true)
        {
            std::string section = match[1].str();
            in_error_section = (section == "Error");
            // ES_LOG(TAG, LEVEL_INFO, "Found section: %s, in_error_section: %d", section.c_str(), in_error_section);
            continue;
        }
        else
        {
            // 输出未匹配的行（排除空行和注释）
            if (!line.empty() && line[0] != ';' && line[0] != '#')
            {
                // ES_LOG(TAG, LEVEL_INFO, "Line not matched as section: %s", line.c_str());
            }
        }

        // 只处理[Error] section下的内容
        res = std::regex_match(line, match, key_value_regex);
        if (in_error_section && res)
        {
            // ES_LOG(TAG, LEVEL_INFO, "Parsing valid line: %s", line.c_str());
            try
            {
                int code = std::stoi(match[1].str());
                std::string desc = match[2].str();
                error_map_[code] = desc;
            }
            catch (...)
            {
                ES_LOG(TAG, LEVEL_WARNING, "Invalid error code format: %s", line.c_str());
            }
        }
        else if (in_error_section)
        {
            ES_LOG(TAG, LEVEL_WARNING, "Invalid line in [Error] section: %s", line.c_str());
        }
    }

    file.close();
    ES_LOG(TAG, LEVEL_INFO, "Loaded %d error codes from %s", error_map_.size(), file_path.c_str());
    return true;
}

std::string ErrorCodeLoader::get_description(int error_code) const
{
    auto it = error_map_.find(error_code);
    if (it != error_map_.end())
    {
        return it->second;
    }
    return "未知错误 (" + std::to_string(error_code) + ")";
}
